<?php
/**
 * Общедоступные функции
 * 
 * Файл с набором базовых общедоступных функций по работе с ядром
 * @author Anton Zavidov
 * @package myLiveShop
 */

/**
 * Массив импортированых файлов где ключ это всевдопуть, а значение - false если файл просто определён, class если определён как класс
 */
$imported=array();
/**
 * Запись логов
 *
 * @param String $text
 */
function L($text){
	if(checkLogConfig('debug'))new Log($text);
}

/**
 * Фабрика классов
 *
 * @param String $name имя класса
 * @return Class
 */
function F($name){
	if(strpos(strtolower($name),'model')===0){
		$name=substr(strtolower($name),5);
		return import('model.'.$name,true);
	}elseif (strpos(strtolower($name),'controller')===0){
		$name=substr(strtolower($name),10);
		return import('controller.'.$name,true);
	}elseif (strpos(strtolower($name),'view')===0){
		$name=substr(strtolower($name),4);
		return import('core.view.'.$name,true);
	}elseif (strpos(strtolower($name),'helper')===0){
		$name=substr(strtolower($name),4);
		return import('helper.'.$name,true);
	}
	
	$name=strtolower($name);
	if(!$return = import($name,true)){
		if(!$return = import('core.'.$name,true)){
			if(!$return = import('model.'.$name,true)){
				if(!$return = import('controller.'.$name,true)){
					if(!$return = import('core.view.'.$name,true)){
						if(!$return = import('helper.'.$name,true)){
							new CoreExeption('Не могу найти файл для класса '.$name,E_ERROR);
							return false;
						}
					}
				}
			}
		}
	}
	return $return; 
}

/**
 * Подключаем файл
 * 
 * Поключаем файл и определяем его класс по имени файла если файл не найден, или не найден класс в нём кидается исключение
 * $return_object отвечает за то просто подключать файл или ещё пытаться опрделить класс.
 * если файл уже был ранее подключен то он возвращается из массива
 *
 * @param string $path псевдо путь разделённый '.'
 * @param boolean $return_object возвратить класс
 * @param boolean $noexit не вылетать если файл не найден
 * @uses $imported
 * @return Class указатель на класс или true/false если $return_object = false
 */
function import($path,$return_object=false,$noexit=false){
	global $imported, $addPath;
	//разбиваем путь на составляющие
	$path_road=explode('.',$path);
	//находим имя класса
	$class=ucfirst($path_road[count($path_road)-1]);
	if(count($path_road)>1){
		switch ($path_road[count($path_road)-2]) {
			case 'model':
				$class='Model'.$class;
				break;
			case 'controller':
				$class='Controller'.$class;
				break;
			case 'view':
				$class='View'.$class;
				break;
			case 'helper':
				$class='Helper'.$class;
				break;
			default:
				break;
		}
	}
	//проверяем не был ли файл импортирован раньше
	if(isset($imported[$path])){
		//проверяем если стоит 'вернуть класс' и класс определён
		if($return_object && $imported[$path]){
			return $imported[$path];
		}elseif (!$return_object){
			return true;
		}else{
			//если файл загружен но класс не определён и надо вернуть класс - пытаемся его определить
			if(class_exists($class)){
				$obj= new $class();
				$imported[$path]= & $obj;
				return $obj;
			}else{
				new CoreExeption('Не могу найти класс '.$class.' в '.$path_road.'.php',E_ERROR,__FILE__,__LINE__,array('path'=>$path,'return_object'=>(int)$return_object));
				return false;
			}
		}
	}
	//переделываем путь в нормальный со слешами
	$path_road=implode('/',$path_road);
	if(isset($addPath))$path_road=$addPath.$path_road;
	//проверяем на существование файла
	if(file_exists($path_road.'.php')){
		require_once($path_road.'.php');
		//записываем что файл импортирован
		$imported[$path]=false;
		//если надо вернуть сласс
		if($return_object){
			//проверяем существование класса
			if(class_exists($class)){
				$obj= new $class();
				//сохраняем ссылку на класс
				$imported[$path]= & $obj;
				return $obj;
			}else{
				//кидаем исключение если класс не найден
				new CoreExeption('Не могу найти класс  '.$class.' в '.$path_road.'.php',E_ERROR,__FILE__,__LINE__,array('path'=>$path,'return_object'=>(int)$return_object));
				return false;
			}
		}else{
			return true;
		}
	}else{
		//кидаем исключение если файл ненайден
		new CoreExeption('Не могу найти файл  '.$path_road.'.php',$noexit?E_WARNING:E_ERROR,__FILE__,__LINE__,array('path'=>$path,'return_object'=>(int)$return_object));
		return false;
	}
}

/**
 * Показывает список импортированных файлов
 *
 * @param string $type тип возвращаемых данных html/json
 * @return string
 */
function showImportedFiles($type='html'){
	global $imported;
	$return=array();
	foreach ($imported as $key=>$value) {
			$return[]=$type=='html'?
			('<li><b>'.str_replace('.',' / ',$key).'.php</b>'.(is_bool($value)?'':' - set').'</li>')
			:(is_bool($value)?$key:array($key,true));
	}
	$return=($type=='html')?
    		'<ol>'.implode('',$return).'</ol>'
    		:json_encode($return);
   	return $return;
}

/**
 * Callback функция для программных ошибок
 *
 * @param int $errno номер ошибки
 * @param string $errstr сообщение об ошибке
 * @param string $errfile файл с ошибкой
 * @param int $errline номер строки
 */
function errorHandler($errno, $errstr, $errfile, $errline){
	new ProgrammExeption($errstr,$errno,$errfile,$errline);
}

/**
 * принудительный выход из программы
 *
 */
function coreExit($exit=true){
	//показываем ошибки
	if($exit){
		echo CoreExeption::showErrorLog(Vars::_(Router::VIEW_TYPE) == 'json1' ? 'json': 'html');
		//показываем содержимое буфера
		ob_flush();
	}
	session_commit();
	if($db=Core::getDB()){
		$db->close();
	}
	if($exit)exit();
}

/**
 * сервисная функция для отображения деревьев массивов
 *
 * @param mixed $value
 * @param boolean $vardump использовать функцию var_dump при выводе, иначе print_r
 */
function pr($value,$vardump=false){
	echo '<hr><pre>';
	if(is_string($value) || is_numeric($value) || is_bool($value) || $vardump)var_dump($value);
	else print_r($value);
	echo '</pre>';
}
/**
 * сервисная функция для отображения переменных
 *
 * @param string $value
 */
function ec($value='',$submol='*'){
	if(is_array($value)||is_object($value)){
		pr($value);
		return;
	}
	echo('<div>'.$submol.' '.$value.'</div>');
}
/**
 * превращаем элемент в массив
 *
 * @param mixed $value строка или число
 */
function toArray(&$value){
	if(!is_array($value)){
		$value=array($value);
	}
	return $value;
}
/**
 * Ищет файлы по условию
 *
 * @param string $searchString условия совпадения
 * @return array массив найденных элементов
 */
function searchFile($searchString){
	$return=array();
	foreach (glob($searchString) as $filename) {
	    $return[]=$filename;
	}
	return $return;
}
/**
 * проверка на уровень логирования
 *
 * @param string $name тип лога
 * @return boolean
 */
function checkLogConfig($name){
	$value=strtolower(Config::_('log_type'));
	if($value=='all')return true;
	if(strpos('*'.$value,strtolower($name)))return true;
	return false;
}
/**
 * Автозагрузка классов
 *
 * @param string $name имя класса
 * @return boolean
 */
function __autoload($name){
	L('Autoload '.$name);
	if($name=='self'){
		new CoreExeption('Не могу найти файл для класса '.$name,E_WARNING);
		return true;
	}
	if(strpos(strtolower($name),'model')===0){
		$name=substr(strtolower($name),5);
		if(import('model.'.$name,null,true)){
			return true;
		}
	}elseif (strpos(strtolower($name),'controller')===0){
		$name=substr(strtolower($name),10);
		if(import('controller.'.$name,null,true)){
			return true;
		}
	}elseif (strpos(strtolower($name),'view')===0){
		$name=substr(strtolower($name),4);
		if(import('core.view.'.$name,null,true)){
			return true;
		}
	}elseif (strpos(strtolower($name),'helper')===0){
		$name=substr(strtolower($name),4);
		if(import('helper.'.$name,null,true)){
			return true;
		}
	}
	
	$name=strtolower($name);
	if(!import($name,null,true)){
		if(!import('core.'.$name,null,true)){
			if(!import('model.'.$name,null,true)){
				if(!import('controller.'.$name,null,true)){
					if(!import('core.view.'.$name,null,true)){
						if(!import('helper.'.$name,null,true)){
							new CoreExeption('Не могу найти файл для класса '.$name,E_ERROR);
							return false;
						}
					}
				}
			}
		}
	}
}

/**
 * Оборочиваем в кавычки
 *
 * @param string $string переменная
 * @return string
 */
function B($string){
	return '"'.preg_replace('/"/im', "'", $string).'"';
}

/**
 * Базовый класс всего и вся
 *
 */
class Base{
	/**
	 * Коструктор
	 * 
	 * логирует вызов экземпляра класса
	 *
	 * @param string $name имя класса
	 */
	public function __construct($name=false){
		L('Вызван класс '.($name?$name:__CLASS__));
	}
}